import Vue from 'vue'
import VueRouter from 'vue-router'

// 进度条
import NProgress from 'nprogress'
import 'nprogress/nprogress.css'

import store from '@/store/index'

import util from '@/libs/util.js'

// 路由数据
import routes from './routes'

Vue.use(VueRouter)

// 导出路由 在 main.js 里使用
const router = new VueRouter({
  routes
})

/**
 * 路由拦截
 * 权限验证
 */
router.beforeEach((to, from, next) => {
  // 进度条
  NProgress.start()
  // 关闭搜索面板
  store.commit('d2admin/search/set', false)
  // 验证当前路由所有的匹配中是否需要有登录验证的
  if (to.matched.some(r => r.meta.auth)) {
    // 这里暂时将cookie里是否存有ticket作为验证是否登录的条件
    // 请根据自身业务需要修改
    const ticket = util.cookies.get('ticket')
    if (ticket && ticket !== 'undefined') {
      const userRole = store.getters['d2admin/account/roles']
      console.log(userRole)
      if (userRole.length === 0) {
        // 判断用户是否有菜单权限
        store.dispatch('d2admin/account/getInfo')
          .then(res => {
            if (res.status === 200) {
              next()
              NProgress.done()
            } else {
              next({ path: '/login' })
              NProgress.done()
            }
          })
          .catch(() => {
            next({ path: '/login' })
            NProgress.done()
          })
      } else {
        const userRolePaths = []
        userRole.map(o => {
          userRolePaths.push(o.menuUrl)
          return o
        })
        if (userRolePaths.indexOf(to.path) === -1) {
          next({ path: '/*' })
        } else {
          next()
        }
      }
    } else {
      // 没有登录的时候跳转到登录界面
      // 携带上登陆成功之后需要跳转的页面完整路径
      next({
        name: 'login',
        query: {
          redirect: to.fullPath
        }
      })
      NProgress.done()
    }
  } else {
    // 不需要身份校验 直接通过
    next()
  }
})

router.afterEach(to => {
  // 进度条
  NProgress.done()
  // 需要的信息
  const app = router.app
  const { name, params, query, fullPath } = to
  // 多页控制 打开新的页面
  app.$store.dispatch('d2admin/page/open', { name, params, query, fullPath })
  // 更改标题
  util.title(to.meta.title)
})

export default router
